package org.sky.cloud.common.http.template;


import com.fasterxml.jackson.databind.JavaType;
import org.sky.cloud.common.constant.ResponseHandlerType;
import org.sky.cloud.common.http.handler.ResponseHandler;
import org.sky.cloud.common.http.handler.StringResponseHandler;
import org.sky.cloud.common.utils.JacksonUtils;

import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;


@SuppressWarnings("all")
public abstract class AbstractNacosRestTemplate {
    
    private final Map<String, ResponseHandler> responseHandlerMap = new HashMap<String, ResponseHandler>();
    
    public AbstractNacosRestTemplate() {
        initDefaultResponseHandler();
    }
    
    private void initDefaultResponseHandler() {
        responseHandlerMap.put(ResponseHandlerType.STRING_TYPE, new StringResponseHandler());
    }
    
    /**
     * register customization Response Hand ler.
     *
     * @param responseHandler {@link ResponseHandler}
     */
    public void registerResponseHandler(String responseHandlerType, ResponseHandler responseHandler) {
        responseHandlerMap.put(responseHandlerType, responseHandler);
    }
    
    /**
     * Select a response handler by responseType.
     *
     * @param responseType responseType
     * @return ResponseHandler
     */
    protected ResponseHandler selectResponseHandler(Type responseType) {
        ResponseHandler responseHandler = null;
        if (responseType == null) {
            responseHandler = responseHandlerMap.get(ResponseHandlerType.STRING_TYPE);
        }
        if (responseHandler == null) {
            JavaType javaType = JacksonUtils.constructJavaType(responseType);
            String name = javaType.getRawClass().getName();
            responseHandler = responseHandlerMap.get(name);
        }
        if (responseHandler == null) {
            responseHandler = responseHandlerMap.get(ResponseHandlerType.DEFAULT_BEAN_TYPE);
        }
        responseHandler.setResponseType(responseType);
        return responseHandler;
    }
}
